#!/bin/bash

# IoT应用守护进程脚本
# 功能：检查网络连通性和DNS解析，然后启动IoT应用程序

APP_PATH="/root/iot/iot"
LOG_FILE="/var/log/iot.log"
PID_FILE="/var/run/iot.pid"

# 日志函数
log_message() {
    echo "$(date '+%Y-%m-%d %T') - $1" | tee -a "$LOG_FILE"
}

led_istest() {
    # TEST == 1 绿灯灭
    # TEST == 0 绿灯亮
    istest=$(grep '^TEST' /etc/iot/iot.cfg | grep -c 1) 
    if [[ $istest -eq 1 ]]; then
        echo 0 > /sys/class/leds/green_led/brightness
    else
        echo 1 > /sys/class/leds/green_led/brightness
    fi
    return 0;
}

# 检查网络连通性
check_network() {
    local timeout=20
    local start_time=$(date +%s)
    local end_time=$((start_time + timeout))
    local network_ok=0
    local dns_ok=0
    # 如果是OFFLINE==1, 则直接返回
    offline=$(grep '^OFFLINE' /etc/iot/iot.cfg | grep -c 1) 
    if [[ $offline -eq 1 ]]; then
        log_message "离线模式，跳过网络检查"
        return 0;
    fi
    log_message "开始网络检查，超时时间: ${timeout}秒"
    
    # 并行检查网络连通性和DNS解析
    while [[ $(date +%s) -lt $end_time ]]; do
        # 检查网络连通性 (ping 8.8.8.8)
        if [[ $network_ok -eq 0 ]]; then
            if ping -c 1 -W 1 8.8.8.8 >/dev/null 2>&1; then
                network_ok=1
                log_message "网络连通性检查成功"
            fi
        fi
        
        # 检查DNS解析
        if [[ $dns_ok -eq 0 ]]; then
            if nslookup google.com >/dev/null 2>&1; then
                dns_ok=1
                log_message "DNS解析检查成功"
            fi
        fi
        
        # 如果两项检查都成功，提前退出
        if [[ $network_ok -eq 1 && $dns_ok -eq 1 ]]; then
            log_message "网络和DNS检查均成功"
            return 0
        fi
        
        # 等待一段时间再检查
        sleep 1
    done
    
    # 检查最终结果
    if [[ $network_ok -eq 1 || $dns_ok -eq 1 ]]; then
        log_message "网络检查部分成功 - 网络: $network_ok, DNS: $dns_ok"
        return 0
    else
        log_message "网络检查超时或失败，但仍将继续启动应用"
        return 0
    fi
}

# 启动应用程序
start_application() {
    log_message "正在启动IoT应用程序: $APP_PATH"
    
    # 启动应用程序
    nohup "$APP_PATH" >> "$LOG_FILE" 2>&1 &
    local pid=$!
    
    # 保存PID
    echo $pid > "$PID_FILE"
    
    # 检查进程是否正在运行
    if kill -0 "$pid" 2>/dev/null; then
        log_message "应用程序启动成功，PID: $pid"
        # 红灯闪烁，代表启动成功
        echo heartbeat > /sys/class/leds/red_led/trigger
        return 0
    else
        log_message "错误: 应用程序启动失败"
        rm -f "$PID_FILE"
        return 1
    fi
}

# 停止应用程序
stop_application() {
    if [[ -f "$PID_FILE" ]]; then
        local pid=$(cat "$PID_FILE")
        if kill -0 "$pid" 2>/dev/null; then
            kill "$pid"
            log_message "已停止应用程序，PID: $pid"
        fi
        rm -f "$PID_FILE"
        echo none > /sys/class/leds/red_led/trigger
    fi
}

# 主函数
main() {
    case "$1" in
        start)
            check_network
            start_application
            ;;
        stop)
            stop_application
            ;;
        restart)
            stop_application
            sleep 2
            check_network
            start_application
            ;;
        status)
            if [[ -f "$PID_FILE" ]]; then
                local pid=$(cat "$PID_FILE")
                if kill -0 "$pid" 2>/dev/null; then
                    echo "应用程序正在运行，PID: $pid"
                    return 0
                else
                    echo "应用程序已停止"
                    return 1
                fi
            else
                echo "应用程序未运行"
                return 1
            fi
            ;;
        *)
            echo "用法: $0 {start|stop|restart|status}"
            return 1
            ;;
    esac
}

# 执行主函数
#ntpdate -vv ntp.aliyun.com
led_istest
main "$@"

